package sliceutil

// Contains 判断元素o是否在s中
func Contains[T comparable](o T, s []T) bool {
	return IndexOf(o, s) >= 0
}

// IndexOf 获取s中第一个o元素的下标
func IndexOf[T comparable](o T, s []T) int {
	return indexOfRange(o, s, 0, len(s))
}

func indexOfRange[T comparable](o T, s []T, start int, end int) int {
	for i := start; i < end; i++ {
		if o == s[i] {
			return i
		}
	}
	return -1
}

// ContainsAll 判断s中是否包含o中全部元素
func ContainsAll[T comparable](o []T, s []T) bool {
	for _, v := range o {
		if !Contains(v, s) {
			return false
		}
	}
	return true
}

// Remove 从s中去除第一个o元素
func Remove[T comparable](o T, s []T) ([]T, bool) {
	for i, v := range s {
		if o == v {
			s = append(s[:i], s[i+1:]...)
			return s, true
		}
	}
	return s, false
}

//泛型类型
//泛型函数
//约束泛型

//type Addable interface {
//	type int, int8, string
//}
//
//func Add[T Addable] (a, b T) T {
//	return a + b
//}
